//
// Created by hi on 25-5-24.
//
/*
 * 动态分配内存
 *  程序员根据需求，向系统主动申请所需大小的内存空间
 *  头文件 stdlib.h
 *  操作相关函数
 *      malloc 分配一个size大小的内存区域
 *      calloc 分配n个size大小的连续内存区域
 *      realloc 重新分配通过malloc或者calloc开辟的内存空间，改变其内存空间的大小
 *      free    释放内存
 */
#include <stdio.h>
#include <stdlib.h>
int main() {

 int *p = NULL;
 p = (int *)malloc(sizeof(int)); //创建一个int类型大小的指针，并强制转为int指针赋值给p
 *p = 123;

 int *a = NULL;
 a = (int *)calloc(4,sizeof(int)); //分配4个4字节大小的内存区域，把首地址当成int*地址赋值给p
 a[0] = 1;
 a[1] = 2;
 // for (int i =0; i < 4; i++) {
 //  printf("%d\n", *(a+i));
 // }
 realloc(a, sizeof(int)*10);//扩容至10个元素
 for (int i = 0; i < 10; i++) {
  printf("%d\n", *(a+i));
 }
 free(a);
 /*
  * 内存4区
  * 在系统为程序开辟内存是，将内存区域划分为4块
  * 1、栈区
  *    存放函数的形参，局部变量
  *    由系统自动分配和释放，当块（符合语句，函数体）执行完毕后自动释放
  * 2、堆区
  *    动态内存申请的区块
  *    由程序手动申请和手动释放，如果没有释放，由操作系统回收
  * 3、全局数据区（区局静态常量区）
  *    存放全局数据，讲台变量，字符串常量等等
  *    程序结束由系统自动释放
  * 4、代码区
  *    存放可执行的代码
  *
  */
}